package cn.tedu.admin.content.service.impl;

import cn.tedu.admin.content.dao.persist.mapper.CategoryMapper;
import cn.tedu.admin.content.dao.persist.mapper.repository.CategoryRepository;
import cn.tedu.admin.content.pojo.bo.CategoryBO;
import cn.tedu.admin.content.pojo.param.CategoryAddParam;
import cn.tedu.admin.content.pojo.po.CategoryPO;
import cn.tedu.admin.content.service.CategoryService;
import cn.tedu.admin.content.util.CommonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private CategoryRepository categoryRepository;

    @Autowired
    private CommonUtils commonUtils;

    @Override
    public List<CategoryBO> listCategory() {
        //从Repository查询数据,Service并不关心Repository
        // 是怎么实现的
        categoryMapper.list();
        List<CategoryPO> list = categoryRepository.list();
        //把PO转换为VO;
        List<CategoryBO> result = new ArrayList<>();
        for (CategoryPO categoryPO : list) {
            CategoryBO categoryBO = new CategoryBO();
            BeanUtils.copyProperties(categoryPO, categoryBO);
            result.add(categoryBO);
        }
        return result;
    }

    @Override
    public void addCategory(CategoryAddParam categoryAddParam) {
        log.debug("开始处理增加类别,参数:{}",categoryAddParam);
        //1 类别名称必须唯一
        String name = categoryAddParam.getName();
        //去数据库查一下,通过类别名称这个类别名称
        Integer count = categoryRepository.countByName(name);
        log.debug("根据列表名称{}统计数量,结果:{}",name,count);
        if (count > 0) {
            //   存在 抛出异常
            String message = "插入失败,这个类别已经存在";
            log.error(message);
            //todo 出了异常,为了方便前端开发人员处理,我们要统一出参(正常和异常),需要一个状态吗
            throw new RuntimeException(message);
        } else {
            //   不存在 插入数据
            //2 判断下这个新插入的类别是子类别还是父类别
            Long parentId = categoryAddParam.getParentId();
            log.debug("新增类别的parentId:{}",parentId);
            if (parentId == 0) { //魔数 不要在代码里写业务不够明确的数字或者字母,应该用常量或者枚举
                //父类别
                log.debug("新增类别的parentId:{},为父类别",parentId);
                //插入方法的时候需要返回结果,要结合业务是返回影响行数还是id
                //todo 去看mybaits 插入数据怎么返回id
                int rows = categoryRepository.addNew(categoryAddParam);
                log.debug("新增类别入参:{},影响行数:{}",categoryAddParam,rows);
            } else {
                //看他的父类别是谁?
                // 这个地方要调用别人的接口,但是接口还没定义
                //todo 等待接口提供再写
                CategoryPO categoryPO =
                        categoryRepository.getCategoryByParentId(parentId);
                log.debug("根据parentId{}查询父类类别结果:{}",parentId,categoryPO);
                if (categoryPO != null) {
                    categoryRepository.addNew(categoryAddParam);
                } else {
                    throw new RuntimeException("插入失败,父类别不存在");
                }
            }
        }
        //  我们要判断 去数据库查一下,通过类别名称查询
        //  是否在数据库存在这个类别名称?
        //   是子类别
        //   看他的父类别是谁?
        //      父类别是否存在
        //          存在 插入
        //          不存在 抛异常
        //   是父类别
        //      直接插入
        //  id name     p_id   is_p     深度
        //  1 家电        0     1         一级
        //  2 电视        1     1         二级
        //  3 冰箱        1     1         二级
        //  4 4k电视      2     0         三级
        //  5 双开门冰箱   3     1         三级
        //  6 海尔兄弟     5     0         四级
        //  我只查询 子类  电视和冰箱  parent_id != 0
        //  我只查询 子类  4k电视   parent_id != 2
        //  我只查询  最下面那层  parent_id > 1  --> is_parent = 0
        //  我只查询  某一级别      增加级别


    }

}
